#ifndef IMGUI3D_MY_WORLD_H
#define IMGUI3D_MY_WORLD_H

#include "imgui.h"
#include "imgui_manager.h"
#include <deque>
#include <functional>
#include <map>
#include <string>

struct ImVec3
{
    float x, y, z;
    ImVec3() : x(0.0f), y(0.0f), z(0.0f) {}
    ImVec3(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {}
};

struct BoxData
{
    ImVec3 pos;   // 盒子中心位置，世界坐标 (x, y, z)
    ImVec3 size;  // 盒子尺寸，沿每个轴的宽、高、深 (width, height, depth)
    ImVec3 rot;   // 盒子旋转角度，通常为欧拉角 (pitch, yaw, roll)，单位为弧度
    ImVec4 color; // 盒子颜色，RGBA格式（红、绿、蓝、不透明度）
};

struct ArrowData
{
    ImVec3 start; // 箭头起点位置，世界坐标 (x, y, z)
    ImVec3 dir;   // 箭头方向向量，可以是归一化或者带长度的方向
    ImVec4 color; // 箭头颜色，RGBA格式（红、绿、蓝、不透明度）
};

class My3DPlot : public Control
{
  public:
    My3DPlot(std::string _name);
    ~My3DPlot();

    void setUpdateDataFunc(std::function<void()> _func);
    void addOrUpdateBox(const std::string &name, const BoxData &box);
    void addOrUpdateArrow(const std::string &name, const ArrowData &arrow);

    void Show() override;

  private:
    std::function<void()> updateData;

    std::map<std::string, BoxData> boxes;
    std::map<std::string, ArrowData> arrows;
};

#endif // IMGUI3D_MY_WORLD_H